#include "pch.hpp"
#include "EngineImpl.hpp"




Engine::EngineImpl::EngineImpl(const EngineInfo& info)
	: m_logger(info.serviceProvider->service<logger::stream>())
	, m_videoDevice(Video::Device::create(info))
	, m_inputDevice(Input::Device::create(info))
	, /*m_audioDevice(AudioDevice::create(info))
	, m_database(new DatabaseSystem(info))
	, m_resources(new ResourceSystem(m_videoDevice, m_audioDevice))
	,*/ m_uiSystem(Ui::System::create(info, m_videoDevice, m_inputDevice))
{
	if(info.scriptDevice == Angelscript)
	{
		m_scriptSystem = Script::System::create(info);
		m_entitySystem = Entity::System::create(info, m_videoDevice, m_inputDevice, m_scriptSystem);
		Entity::System::registerType(m_scriptSystem);
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////

Engine::EngineImpl::ptr Engine::EngineImpl::create(const EngineInfo& info)
{
	return boost::make_shared<EngineImpl>(info);
}
///////////////////////////////////////////////////////////////////////////////////////////////////




Engine::Input::Device::ptr Engine::EngineImpl::inputDevice() const
{
	return m_inputDevice;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

Engine::Video::Device::ptr Engine::EngineImpl::videoDevice() const
{
	return m_videoDevice;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
/*
AudioDevicePtr Engine::EngineImpl::audioDevice() const
{
	return m_audioDevice;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

DatabaseSystemPtr Engine::EngineImpl::databaseSystem() const
{
	return m_database;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

ResourceSystemPtr Engine::EngineImpl::resourceSystem() const
{
	return m_resources;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
*/

Engine::Ui::System::ptr Engine::EngineImpl::uiSystem() const
{
	return m_uiSystem;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

Engine::Script::System::ptr Engine::EngineImpl::scriptSystem() const
{
	return m_scriptSystem;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

Engine::Entity::System::ptr Engine::EngineImpl::entitySystem() const
{
	return m_entitySystem;
}
///////////////////////////////////////////////////////////////////////////////////////////////////




void Engine::EngineImpl::update()
{
	m_inputDevice->update();
	m_videoDevice->update();
	/*m_audioDevice->update();

	m_database->update();
	m_resources->update();*/
	m_uiSystem->update();
	m_scriptSystem->update();
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void Engine::EngineImpl::resize(int width, int height)
{
	try
	{
		m_videoDevice->resize(width, height);
		m_inputDevice->resize(width, height);
		m_uiSystem->resize(width, height);
	}
	catch(exception& e)
	{
		throw critical_exception(format("Resizing the window failed: %1%. The engine is now in an undefined state and must shut down") % e.what()) << debug_info_e(e);
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void Engine::EngineImpl::changeWindow(HWND window)
{
	try
	{
		m_videoDevice->changeWindow(window);
		m_inputDevice->changeWindow(window);
	}
	catch(exception& e)
	{
		throw critical_exception(format("Changing the window failed: %1%. The engine is now in an undefined state and must shut down") % e.what()) << debug_info_e(e);
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
